package com.jd.oneday.month3;

/**
 * 一个管理双向链表的类
 */

public class Day13_DoubleLinkedList {

    Day13_LinkedListNode node = new Day13_LinkedListNode(0, "", 0);


    /**
     * 创建双向链表
     *
     * @param n 添加的节点
     */
    public void add(Day13_LinkedListNode n) {

        Day13_LinkedListNode temp = node;

        while (true) {
            if (temp.getNext() == null) {
                break;
            }
            temp = temp.getNext();
        }

        temp.setNext(n);
        n.setPre(temp);
    }


    /**
     * 增  通过id大小插入到表中
     *
     * @param h 要插入的节点
     */
    public void ByIdAdd(Day13_LinkedListNode h) {
        isNull();

        Day13_LinkedListNode temp = node;
        boolean flag = false;

        while (temp.getNext() != null) {
            if (temp.getId() > h.getId()) {
                break;
            }
            if (temp.getId() == h.getId()) {
                flag = true;
                break;
            }
            temp = temp.getNext();

        }

        if (flag) {
            System.out.println("想要插入的ID" + h.getId() + "已存在");
        } else {
            h.setNext(temp.getNext());
            temp.setNext(h);
            h.setPre(temp);
        }
    }

    /**
     * 删  通过id删除
     */
    public void del(int i) {
        isNull();

        Day13_LinkedListNode temp = node;
        boolean flag = false;

        while (temp.getNext() != null) {

            if (temp.getId() == i) {
                flag = true;
                break;
            }
            temp = temp.getNext();
        }

        if (flag) {
            // temp.getPre().getNext().setNext(temp.getNext()) == temp.pre.next = temp.next
            temp.getPre().setNext(temp.getNext());

            //假如删除最后一个节点，temp.getNext()  空指针异常
            //如果是最后一个节点就不执行这句代码     temp.getNext().getPre().setPre(temp.getPre()) == temp.next.pre = temp.pre
            if (temp.getNext() != null) {
                temp.getNext().setPre(temp.getPre());
            }
        } else {
            System.out.println("想要删除的ID" + i + "不存在");
        }
    }

    /**
     * 修改  通过id修改
     */
    public void update(Day13_LinkedListNode h) {

        //判断节点是否为空
        if (node.getNext() == null) {
            System.out.println("链表为空");
            return;
        }

        Day13_LinkedListNode temp = node.getNext();

        //找到需要修改的节点，根据id寻找
        boolean flay = false;
        while (true) {
            if (temp.getNext() == null) {
                break;
            }
            if (temp.getId() == h.getId()) {
                flay = true;
                break;
            }
            temp = temp.getNext();
        }
        //根据flay判断是否找到要修改的节点
        if (flay) {
            temp.setName(h.getName());
            temp.setAge(h.getAge());
        } else {
            System.out.println("没有找到ID为" + h.getId() + "的节点，不能修改");
        }
    }


    /**
     * 遍历
     */
    public void list() {

        Day13_LinkedListNode temp = node.getNext();

        isNull();

        while (true) {
            if (temp == null) {
                break;
            }
            System.out.println(temp);
            temp = temp.getNext();
        }
    }

    public void isNull() {
        if (node.getNext() == null) {
            System.out.println("这是一个空链表");
            return;
        }
    }
}
